﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace HomeWork
{
    internal class CheckTime
    {


        //检查是否过期5分钟
        public static bool HasExpired(DateTime last)
        {
            DateTime currentTime = DateTime.Now;
            double timeDifference = (double)(currentTime - last).TotalMinutes; //计算时间差，单位为分钟

            //判断时间差是否超过5分钟
            return timeDifference > 5;
        }

        //检查是否过期24小时
        public static bool IsNewLogin(DateTime last)
        {
            DateTime currentTime = DateTime.Now;
            double timeDifference = (double)(currentTime - last).TotalHours;//计算时间差，单位为小时

            //判断时间差是否超过24小时
            return timeDifference > 24;
        }

        //将时间转换为中文格式
        public static String ToChinese(DateTime time)
        {
            return time.ToString("yyyy年MM月dd日 hh点mm分ss秒");
            //显示：2019年12月01日 07点59分14秒
        }

        internal enum TimeUnit 
        { 
            day, week, month
        }

        //计算一个日期若干（日/周/月）后的日期 
        internal static DateTime GetDate(DateTime originDate, int value, TimeUnit timeSpan)
        {
            switch (timeSpan)
            {
                case TimeUnit.day:
                    return originDate.AddDays(value);
                case TimeUnit.week:
                    return originDate.AddDays(value * 7);
                case TimeUnit.month:
                    return originDate.AddMonths(value);
                default:
                    throw new ArgumentException("不支持的时间单位。请使用'Day'、'Week'、'Day'。", nameof(timeSpan));
            }
        }

        // 方法重载2：核心方法，接受用户输入的字符串
        public static DateTime GetDate(string input)
        {
            // 检查输入是否包含指定起始时间的标识符 "@"
            if (input.Contains("@"))
            {
                // 拆分字符串，例如将 "2024-03-15@3月" 拆分为 "2024-03-15" 和 "3月"
                string[] parts = input.Split('@');
                if (parts.Length != 2)
                {
                    throw new ArgumentException("输入格式不正确。请使用类似'2024-03-15@3月'或'12周'的格式。");
                }

                string baseDateString = parts[0].Trim();
                string timeSpanString = parts[1].Trim();

                // 尝试解析用户提供的基准日期
                // 定义几种常见的日期格式
                string[] dateFormats = { "yyyy-MM-dd", "yyyy/MM/dd", "MM/dd/yyyy", "dd-MM-yyyy" };
                if (!DateTime.TryParseExact(baseDateString, dateFormats, null, System.Globalization.DateTimeStyles.None, out DateTime baseDate))
                {
                    throw new ArgumentException($"无法解析基准日期 '{baseDateString}'。请尝试使用类似 'yyyy-MM-dd' 的格式。");
                }

                // 解析时间间隔部分（如“3月”），并基于解析出的baseDate进行计算
                return CalculateDateFromSpan(baseDate, timeSpanString);
            }
            else
            {
                // 如果没有@符号，则使用当前时间作为基准，并直接解析整个字符串为时间间隔
                return CalculateDateFromSpan(DateTime.Now, input);
            }
        }

        //通过控制台读取用户输入，比如：3月，12周，100天，利用之前作业的GetDate()方法，输出指定时间段后的日期
        public static DateTime CalculateDateFromSpan(DateTime baseDate, string timeSpanString)
        {
            // 使用正则表达式提取数字和单位，模式允许数字和单位间有空格
            string pattern = @"^\s*(\d+)\s*([天月周])\s*$";
            var match = Regex.Match(timeSpanString, pattern);

            if (match.Success)
            {
                int value = int.Parse(match.Groups[1].Value);
                string timeUnit = match.Groups[2].Value;

                // 根据时间单位计算新的日期
                switch (timeUnit)
                {
                    case "月":
                        return baseDate.AddMonths(value);
                    case "周":
                        return baseDate.AddDays(value * 7);
                    case "天":
                        return baseDate.AddDays(value);
                    default:
                        throw new ArgumentException("不支持的时间单位。请使用'月'、'周'、'天'。");
                }
            }
            else
            {
                throw new ArgumentException("时间间隔格式不正确。请使用类似'3月'、'12周'、'100天'的格式。");
            }
        }

        public static void ShowWeeksIn(int year)
        {
            // 获取该年的第一天
            DateTime firstDayOfYear = new DateTime(year, 1, 1);

            // 获取该年的第一天是星期几（0=星期日，1=星期一，...，6=星期六）
            DayOfWeek firstDayOfWeek = firstDayOfYear.DayOfWeek;

            // 计算第一周的开始日期（如果该年的第一天不是星期一，则向前推算到最近的星期一）
            DateTime firstWeekStart = firstDayOfYear.AddDays(-(int)firstDayOfWeek + 1);

            // 计算该年的最后一天                     
            DateTime lastDayOfYear = new DateTime(year, 12, 31);

            // 计算该年最后一周的结束日期（如果该年的最后一天不是星期日，则向后推算到最近的星期日）
            //DateTime lastWeekEnd = lastDayOfYear.AddDays(6 - (int)lastDayOfYear.DayOfWeek);
            DateTime lastWeekEnd = lastDayOfYear.AddDays(7 - (int)lastDayOfYear.DayOfWeek);
            // 计算总周数
            int totalWeeks = (int)Math.Ceiling((lastWeekEnd - firstWeekStart).TotalDays / 7);

            // 按周输出
            for (int week = 1; week <= totalWeeks; week++)
            {
                DateTime weekStart = firstWeekStart.AddDays((week - 1) * 7);
                DateTime weekEnd = weekStart.AddDays(6);

                // 格式化输出
                Console.WriteLine($"第{week}周 {weekStart:yyyy年M月d日} - {weekEnd:yyyy年M月d日}");
            }


        }
    }
}
